package src.jdk8;

import java.util.Optional;

/**
 * @author jack.wu
 * @version 1.0
 * @date 2020/5/26
 */
public class OptionalDemo {

    public static void main(String[] args) {
        Student student = new Student(23, "jack");
        // of 放入的时候会调用 Objects.requireNonNull(T obj) 检查是否为Null 如果null会抛异常
        Optional<Student> sutOpt = Optional.of(student);
        // ofNullable 放入的时候会判断是否空如果为空填充一个EMPTY的Optional，如果不为空调用of方法
        Optional<Student> student1 = Optional.ofNullable(student);

        if (student1.isPresent()) {
            // optional中有值才会进来
            Student stu = student1.get();
            System.out.println(stu);
        }

        // 如果Optional中的值存在 会把值传到自己写的Consumer去消费
        student1.ifPresent(System.out::println);

        // get 获取的时候 会判断这个optional中有没有值 没有抛异常；有返回
        System.out.println(sutOpt.get());

        // filter 首先会检查传入的断言（Predicate）实现是否为空，如果为空抛异常；
        // 如果optional中有值则通过传入的断言去判断，判断成功返回，失败返回EMPTY的Optional
        student1.filter(f -> f.getAge() > 18)
                .ifPresent(System.out::println);

        // map 首先会检查传入的函数（Function）实现是否为空，如果为空抛异常
        // 如果optional中有值 则返回一个用使用函数功能的Optional
        Optional<Integer> age = student1.map(Student::getAge);

        // 功能和map 差不多 区别就是传入的值类型不同
        Optional<Integer> ageOpt = student1.flatMap(s -> Optional.of(s.getAge()));

        // orElse 如果包装对象值非空，返回包装对象值，否则返回入参other的值
        Integer ageElse = student1.map(Student::getAge).orElse(0);

        // orElseGet 用Supplier对象的get()方法的返回值作为默认值
        Integer integer = student1.map(Student::getAge).orElseGet(() -> 1);

        // orElseThrow 在orElseThrow()中将异常抛出：
        student1.map(Student::getAge).orElseThrow(()->new RuntimeException("zz"));


    }

}

class Student {

    private int age;
    private String name;

    public Student(int age, String name) {
        this.age = age;
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    @Override
    public String toString() {
        return "Student{" +
                "age=" + age +
                ", name='" + name + '\'' +
                '}';
    }
}